package net.jueb.protoServer.controller;
import net.jueb.protoServer.annotation.PortServiceControllerAnnotation;
import io.netty.channel.ChannelHandlerContext;

/**
 * 抽象控制器基类,使用protobuf扩展消息请求类型
 * 该控制器被服务所选择,一个服务不能拥有重复相同类型的控制器实例
 * 该控制器实现类将会拥有@PortServiceControllerAnnotation注解特性方便被扫描
 * @author Administrator
 * @param <T> T为最终到达控制器的消息类型,不一定是解码器解码后的类型,可能在分发器中或分发器后进行二次解码
 */
@PortServiceControllerAnnotation
public abstract class ServiceController<T> {
	
	/**
	 * 获取控制器名称
	 * @return
	 */
	public abstract String getControllerName();
	
	/**
	 * 逻辑控制器id
	 * @return
	 */
	public abstract int getId();
	
	/**
	 * 执行处理请求的方法
	 * @param ctx
	 * @param msg 扩展类型消息
	 */
	public abstract void execute(ChannelHandlerContext ctx,T extMsg)throws Exception;
	
	/**
	 * 根据消息ID判断是否是同一个控制器
	 */
	@Override
	public final boolean equals(Object obj) {
		if(obj instanceof ServiceController)
		{
			ServiceController<?> sc=(ServiceController<?>)obj;
			return getId()==sc.getId();
		}
		return super.equals(obj);
	}
	
	@Override
	public final int hashCode() {
		return super.hashCode();
	}
}
